#include <stdio.h>

void swap(int* a, int*b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

// 冒泡排序，升序排列
void bubble_sort(int A[], int n) {
    // 最多n-1趟
    for (int i = 0; i < n-1; ++ i) {
        int swapped = 0; // 记录每趟排序是否发生了交换操作
        // 新一趟排序
        // 对记录从前往后进行，因每次取一对，故只到n-1而不是n.
        for (int j = 0; j < n-1; ++j)
        {
            // 正序，继续
            if(A[j] <= A[j+1]) continue;
            // 逆序, 交换
            swap(&A[j], &A[j+1]);
            // 还存在交换操作，打标记
            swapped = 1;
        }
        // 不再出现交换操作，已正序，结束排序循环
        if(0 == swapped)
            break;
    }
}

void traverse(int A[], int n) {
    for (int i = 0; i < n; ++ i) {
        printf("%d ", A[i]);
    }
    printf("\n");
}

int main()
{
    int A[] = {3,5,27,10,20,17,4,23,2,11};
    int n = sizeof(A) / sizeof(int);
    printf("array length: %d \n", n);
    bubble_sort(A, n);
    traverse(A, n);
}